/**
 * 对应接口文档地址
 * http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html
 */
package cn.rengy.tpa.wxmp.message;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;

import cn.rengy.tool.http.HttpUtils;
import cn.rengy.tpa.wxmp.exception.WeChatException;
import cn.rengy.tpa.wxmp.message.template.TemplateMsgBody;
import cn.rengy.tpa.wxmp.message.template.TemplateMsgData;
import cn.rengy.tpa.wxmp.token.AccessToken;
import cn.rengy.tpa.wxmp.util.WeChatReturnCode;

/**
 * 模板消息接口
 * 
 * @author ChengNing
 * @date 2014年12月24日
 */
public class TemplateMsg {

	private static Logger logger = LoggerFactory.getLogger(TemplateMsg.class);

	// 设置所属行业接口地址
	public static final String SET_INDUSTRY_URL = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=";
	// 添加模板id接口地址
	public static final String GET_TEMPLATE_ID_URL = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=";
	// 发送模板消息接口地址
	public static final String SEND_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";

	private static final int retry = 2;// 失败重试

	/**
	 * 设置所属行业 IT科技 互联网/电子商务 1 IT科技 IT软件与服务 2
	 * 
	 * @throws WeChatException
	 */
	public static void setIndustry(AccessToken accessToken,Integer... industrys) throws WeChatException {
		String url = SET_INDUSTRY_URL + accessToken.token();
		JSONObject json = new JSONObject();
		for (int i = 0; i < industrys.length; i++) {
			json.put("industry_id" + i, industrys[i]);
		}
		String data = json.toJSONString();
		HttpUtils.post(url, data);
	}

	/**
	 * 获得模板ID
	 * 
	 * @param templateIdShort
	 *            template_id_short
	 * @return template_id
	 * @throws WeChatException
	 */
	public static String getTemplateId(AccessToken accessToken,String templateIdShort) {
		logger.debug("get template id,short template id is:" + templateIdShort);
		// 构造请求数据
		JSONObject json = new JSONObject();
		json.put("template_id_short", templateIdShort);
		String data = json.toJSONString();
		for (int i = 0; i < retry; i++) {
			String resultStr = HttpUtils.post(GET_TEMPLATE_ID_URL + accessToken.token(), data);
			logger.debug("post result:" + resultStr);
			JSONObject jsonObject = JSONObject.parseObject(resultStr);
			int errCode = jsonObject.getIntValue("errcode");
			if (errCode == 0) {
				return jsonObject.getString("template_id");
			} else if (errCode == 40001) {
				accessToken.refresh();
			} else {
				throw new WeChatException(errCode, jsonObject.getString("errmsg"));
			}
		}
		return null;
	}

	/**
	 * 发送模板消息
	 * 
	 * @throws WeChatException
	 */
	public static String send(AccessToken accessToken,TemplateMsgBody postData) throws WeChatException {
		// 构造请求数据
		JSONObject json = new JSONObject();
		json.put("touser", postData.getTouser());
		json.put("template_id", postData.getTemplateId());
		String url=postData.getUrl();
		if(StringUtils.isNotBlank(url)) {
			json.put("url", url);
		}
		String color=postData.getColor();
		if(StringUtils.isNotBlank(color)) {
			json.put("color", color);
		}
		JSONObject jsonData = new JSONObject();
		for (TemplateMsgData data : postData.getData()) {
			JSONObject keynote = new JSONObject();
			keynote.put("value", data.getValue());
			keynote.put("color", data.getColor());
			jsonData.put(data.getName(), keynote);
		}
		json.put("data", jsonData);
		String data = json.toJSONString();
		//logger.debug("发送模板消息-请求:{}" , data);
		for (int i = 0; i < retry; i++) {
			String resultStr = HttpUtils.post(SEND_MSG_URL + accessToken.token(), data);
			//logger.debug("发送模板消息-响应:{}" , resultStr);
			JSONObject jsonObject = JSONObject.parseObject(resultStr);
			int errCode = jsonObject.getIntValue("errcode");
			if (errCode == 0) {
				return jsonObject.getString("msgid");
			} else if (errCode == 40001) {
				accessToken.refresh();
			} else {
				throw new WeChatException(errCode,WeChatReturnCode.getMsg(errCode, jsonObject.getString("errmsg")));
			}
		}
		return null;
	}
}
